﻿/**
 * 按钮插件 [lilizing@foxmail.com]
 */
(function($) {
	/*
	 * 按钮定义
	 */
	$.fn.button = function(options, params) {
		if (typeof params == "string") {
			return $.fn.button.methods[options](this, params);
		}
		return this.each(function() {
			var $this = $(this);
			var data = $.data(this, "button");
			var opts;
			if (data) {
				opts = $.extend(data.options, options);
			} else {
				opts = $.extend({}, $.fn.button.defaults, $.fn.button
						.parseOptions(this), options);
				data = $.data(this, "button", {
					options : opts
				});
			}
			if (opts.toggle == 'button') {
				$this.addClass('btn').addClass('btn-' + opts.theme);
				$this.bind('click.btn', function(e) {
					opts.onActive.call($this, e);
					e.preventDefault();
				});
			} else if (opts.toggle == 'toggle') {
				$this.addClass('btn').addClass('btn-' + opts.theme);
				$this.bind('click.btn', function(e) {
					$this.toggleClass('active');
					if ($this.hasClass('active')) {
						opts.onActive.call($this, e);
					} else {
						opts.onDisActive.call($this, e);
					}
					e.preventDefault();
				});
			} else if (opts.toggle == 'loading') {
				$this.addClass('btn').addClass('btn-' + opts.theme);
				$this.bind('click.btn', function(e) {
					$this.toggleClass('active');
					var val = $this.is('input') ? 'val' : 'html';
					$this[val](opts.loadingMessage);
					$this.addClass('disabled').attr('disabled', 'disabled');
					opts.onActive.call($this, e);
					e.preventDefault();
				});
			} else if (opts.toggle == 'checkbox') {
				$this.addClass('btn-group');
				var items = opts.items;
				if (items) {
					$.each(items, function(i, item) {
						$this.append($('<button class=\"btn btn-' + opts.theme
								+ ' ' + (item.active ? 'active' : '')
								+ '\" value=\"' + item.value + '\">'
								+ item.text + '</button>'));
					});
					$this.on('click.btn', '.btn.btn-' + opts.theme,
							function(e) {
								var $btn = $(e.target);
								$btn.toggleClass('active');
								if ($btn.hasClass('active')) {
									opts.onActive.call($btn, e);
								} else {
									opts.onDisActive.call($btn, e);
								}
								e.preventDefault();
							});
				}
			} else if (opts.toggle == 'radio') {
				$this.addClass('btn-group');
				var items = opts.items;
				if (items) {
					$.each(items, function(i, item) {
						$this.append($('<button class=\"btn btn-' + opts.theme
								+ ' ' + (item.active ? 'active' : '')
								+ '\" value=\"' + item.value + '\">'
								+ item.text + '</button>'));
					});
					$this.on('click.btn', '.btn.btn-' + opts.theme,
							function(e) {
								$this.find('.active').removeClass('active');
								var $btn = $(e.target);
								$btn.toggleClass('active');
								if ($btn.hasClass('active')) {
									opts.onActive.call($btn, e);
								} else {
									opts.onDisActive.call($btn, e);
								}
								e.preventDefault();
							});
				}
			}
		});
	};
	// 方法定义
	$.fn.button.methods = {
		options : function(jq) {
			return $.data(jq[0], "draggable").options;
		},
		reset : function(jq) {
			return jq.each(function() {
				$(this).button({});
			});
		},
		enable : function(jq) {
			return jq.each(function() {
				$(this).button({
					disabled : false
				});
			});
		},
		disable : function(jq) {
			return jq.each(function() {
				$(this).button({
					disabled : true
				});
			});
		},
		getValue : function(jq) {
			return jq.each(function() {
				$(this).button({

				});
			});
		}
	};
	// 解析属性
	$.fn.button.parseOptions = function(elem) {
		var t = $(elem);
		return {
			id : t.attr("id")
		};
	};
	// 属性定义
	$.fn.button.defaults = {
		toggle : 'button',// 类型，包括button||toggle||loading||radio||checkbox
		theme : 'default',// 样式主题
		loadingMessage : 'loading...',// 加载中信息
		disabled : 'false',// 失效与否
		items : null,// 选项，作用于toggle为radio或checkbox时
		onActive : function(e) {
		},
		onDisActive : function(e) {
		}
	};
})(window.jQuery);